package array;

public class DeleteTargetValue {


    // 辅助方法：打印数组前len个元素
    private static void printArray(int[] arr, int len) {
        System.out.print("[");
        for (int i = 0; i < len; i++) {
            System.out.print(arr[i]);
            if (i < len - 1) System.out.print(", ");
        }
        System.out.println("]");
    }

    public static void main(String[] args) {
        int[] testArr1 = {3, 2, 2, 3};
        int target1 = 3;
        int[] testArr2 = {0, 1, 2, 2, 3, 0, 4, 2};
        int target2 = 2;

        // 测试暴力算法
        int len1 = removeElementBruteForce(testArr1, target1);
        System.out.println("暴力算法结果: 新长度 = " + len1);
        System.out.println("testArr1 = " + testArr1);
        printArray(testArr1, len1);  // 打印处理后的数组

        // 测试双指针算法
        int len2 = removeElementTwoPointers(testArr2, target2);
        System.out.println("双指针算法结果: 新长度 = " + len2);
        System.out.println("testArr2 = " + testArr2);
        printArray(testArr2, len2);
    }

    /**
     * slow 是新数组元素的额下标 （我要的元素要放在哪）
     * fast 是指向新数组元素的指针 （哪些元素是我要的）
     *
     * @param clone
     * @param target2
     * @return
     */
    private static int removeElementTwoPointers(int[] clone, int target2) {
        int slow = 0;
        for (int fast = 0;fast<clone.length;fast++) {
            //1.slow ==0  ;fast 在for 初始为0 然后++移动
            //2.如果 当前值不是目标值 就是新数组的元素（要进行赋值，slow++）
            if(clone[fast]!=target2)
            {
                clone[slow] = clone[fast];
                slow++;
            }
        }

        return slow;
    }

    /**
     * 删除指定值在数组中 并返回新数组的尺度
     *
     * @param clone   原数组
     * @param target1 要删除的数值
     * @return 新数组长度
     */
    private static int removeElementBruteForce(int[] clone, int target1) {
        //1.使用循环移动元素找到要删除的元素
        int len = clone.length;
        for (int i = 0; i < len; i++) {
            //2.使用另一个循环,当找到目标元素的时候,把被删的位置后的元素往前移动
            if (clone[i] == target1) {
                for (int j = i; j < len - 1; j++) {
                    clone[j] = clone[j + 1];
                }
                //3.len--
                len--;
                //重新检查该位置
                i--;
            }

        }
        //4.返回len
        return len;
    }

}
